package com.itheima.demo8;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class MyReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取class对象的三种方式

        //1.获取class字节码文件对象
        Class calss = Class.forName("com.itheima.demo8.Student");

        //获取所有的公开的构造方法
        Constructor[] cons = calss.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }

        //获取所有的构造方法
        Constructor[] cons1 = calss.getDeclaredConstructors();
        for (Constructor con : cons1) {
            System.out.println(con);
        }

        //获取单个的构造方法（私有的也行）
        Constructor cons2 = calss.getDeclaredConstructor();
        System.out.println(cons2);

        //参数要与构造方法的参数保持一致
        //返回的Constructor对象可以看到原对象的私有构造，但不能直接调用，想调用需要进行暴力反射
        Constructor cons3 = calss.getDeclaredConstructor(String.class,String.class,int.class,double.class);
        System.out.println(cons3);

        //获取构造方法的权限 返回值为数字
        int modifiers = cons3.getModifiers();
        System.out.println(modifiers);

        //获取构造方法的参数，以数组的方式返回
        Parameter[] parameters = cons3.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

//        Student s = new Student();

        //暴力反射：临时取消权限的校验
        //暴力反射后可以使用私有构造方法创建对象
        cons3.setAccessible(true);
        //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例，并用指定的初始化参数初始化该实例。
        Object o = cons3.newInstance();


    }
}
